package com.sky.service.impl;

import com.sky.constant.MessageConstant;
import com.sky.context.BaseContext;
import com.sky.entity.AddressBook;
import com.sky.exception.AddressBookBusinessException;
import com.sky.mapper.AddressBookMapper;
import com.sky.service.AddressBookService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.List;

/**
 * @ClassName AddressBookServiceImpl
 * @Description 地址簿业务层实现类
 * @Author sld
 * @Date 2024/7/12 15:40
 * Version 1.0
 **/
@Service
public class AddressBookServiceImpl implements AddressBookService {

    @Resource
    private AddressBookMapper addressBookMapper;

    /**
     * 新增地址
     * @param addressBook
     */
    @Override
    public void add(AddressBook addressBook) {
        // 设置属性值
        addressBook.setUserId(BaseContext.getCurrentId());  // 设置当前用户
        addressBook.setIsDefault(0); // 设置默认地址为0
        // 调用持久层新增方法
        addressBookMapper.add(addressBook);
    }

    /**
     * 查询用户的所有地址
     * @return
     */
    @Override
    public List<AddressBook> list() {
        // 封装对象
        AddressBook addressBook = new AddressBook();
        addressBook.setUserId(BaseContext.getCurrentId());
        // 调用持久层查询方法
        List<AddressBook> list =  addressBookMapper.list(addressBook);
        return list;
    }

    /**
     * 设置默认地址
     * 默认地址有且只能有一个
     *  设置默认地址前，需要把其他的地址设置为非默认状态
     * @param addressBook
     */
    @Override
    @Transactional
    public void setDefault(AddressBook addressBook) {
        // 添加当前用户id
        addressBook.setUserId(BaseContext.getCurrentId());
        // 保存当前地址
        Long id = addressBook.getId();

        /* 其他的地址设置为非默认状态 */
        addressBook.setIsDefault(0); // 设为非默认地址
        addressBook.setId(null);    // 不设置id，让修改当前用户的所有地址
        // 执行修改
        addressBookMapper.update(addressBook);

        /* 把当前地址设置为默认  */
        addressBook.setIsDefault(1);
        addressBook.setId(id);
        // 执行修改
        addressBookMapper.update(addressBook);
    }

    @Override
    public void update(AddressBook addressBook) {
        addressBook.setUserId(BaseContext.getCurrentId());
        // 调用持久层的修改方法
        addressBookMapper.update(addressBook);
    }
    /**
     * 根据id查询地址
     * @return
     */
    @Override
    public AddressBook getById(Long id) {
        // 创建实体类
        AddressBook addressBook = new AddressBook();
        addressBook.setId(id);  // 地址id
        addressBook.setUserId(BaseContext.getCurrentId());  // 用户id
        // 执行查询方法
        List<AddressBook> list = addressBookMapper.list(addressBook);
        // 有没有查询到地址
        if (list != null && list.size() > 0) {  // 查到地址
            return list.get(0);  // 返回地址
        }
        // 没有查到地址，则抛出异常
        throw new AddressBookBusinessException(MessageConstant.ADDRESS_NOT_FOUND);
    }

    /**
     * 查询默认地址
     * @return
     */
    @Override
    public AddressBook getDefault() {
        // 创建实体类
        AddressBook addressBook = new AddressBook();
        addressBook.setIsDefault(1); // 默认地址
        addressBook.setUserId(BaseContext.getCurrentId());  // 用户id
        // 执行查询方法
        List<AddressBook> list = addressBookMapper.list(addressBook);
        // 有没有查询到地址
        if (list != null && list.size() > 0) {  // 查到地址
            return list.get(0);  // 返回地址
        }
        // 没有查到地址，则抛出异常
        throw new AddressBookBusinessException(MessageConstant.ADDRESS_NOT_FOUND);
    }
}
